파이썬 함수

함수

모든 프로그래밍 언어에서 함수는 코드를 재사용하고 조직화하기 위한 가장 중요한 수단이다.

함수 선언 및 정의

파이썬에서 함수는 def 예약어로 정의하고 return 예약어를 사용해서 값을 반환한다. return 문이 몇 개가 되든 상관없으며, 함수 블록이 끝날때까지 return문이 없다면 None이 반환된다.

def my_function(x, y, z = 1.5):
if z > 1:
return z * (x + y)
else:
return z / (x + y)

함수 호출

함수는 여러 개의 일반 인자와 키워드 인자를 받을 수 있다. 함수의 키워드 인자는 항상 일반 인자 다음에 와야 한다는 규칙이 있다. 아래 코드에서 x와 y는 일반 인자이며, z는 키워드 인자이다.

print(my_function(4, 6))         # 15.0
print(my_function(5, 6, z=0.7)) # 0.06363636363636363
print(my_function(3.14, 7, 3.5)) # 35.49

여러 값 반환하기

Java와 C++과는 달리 파이썬은 하나의 함수에서 여러 개의 값을 반환할 수 있다. 반환되는 값의 수 만큼 변수를 사용해도 되고, 변수 하나에 여러 반환값을 할당할 수도 있다. 후자의 경우 반환되는 자료형은 튜플이다.

def func():
a = 5
b = 6
c = 7
return a, b, c

a, b, c = func()
return_value = func()
print(a, b, c) # 5 6 7
print(return_value) # (5, 6, 7)


네임스페이스, 스코프, 지역 함수

함수는 전역과 지역, 이 두 가지 스코프(Scope)에서 변수를 참조한다. 변수의 스코프를 설명하는 다른 용어로 네임스페이스가 있다. 함수 내부에서 선언된 변수는 모두 지역 네임스페이스에 속한다. 지역 네임스페이스는 함수가 호출될 때 생성되며 함수의 실행이 끝나면 지역 네임스페이스는 사라진다.

def func():
a = []
for i in range(5):
a.append(i)
print(a) # [0, 1, 2, 3, 4]

func()
print(a) # NameError: name 'a' is not defined

함수 안에서 전역 변수에 값을 대입하려면 그 변수는 global 예약어를 통해 전역 변수로 선언해야 한다. global 예약어가 없는 경우 전역 변수에 접근할 수 있지만 수정은 불가하다.

a = None
def func():
a = 255
print(a) # 255

func()
print(a) # a = None

a = None
def bind_a_variable():
global a
a = []

bind_a_variable()
print(a) # []

함수는 어디에서나 선언할 수 있으며, 함수가 호출 되었을 때 지역 함수를 선언하는 것도 문제가 되지 않는다. 아래 코드에서 inner_function()은 outer_function()이 호출되기 전까지는 존재하지 않으며,
outer_function()이 끝나면 inner_function()은 사라진다.

def outer_function(x, y, z):
def inner_function(a, b, c):
pass
pass


익명 함수

파이썬은 익명 함수 혹은 람다 함수를 지원한다. lambda 예약어를 사용해서 정의하며, 이는 값을 반환하는 단순한 한 문장으로 이루어진 함수를 의미한다. 람다 함수가 익명 함수라고 불리는 이유 중 하나는 이 함수 객체에는 이름 속성이 없기 때문이다.

def short_function(x):
return x * 2

equiv_anon = lambda x: x * 2

print(equiv_anon) # <function <lambda> at 0x000001573534AEE0>
print(short_function(2), equiv_anon(2)) # 4 4

람다 함수를 사용하면 실제 함수를 선언하거나 람다 함수를 지역 변수에 대입하는 것보다 코드를 적게 쓰면서 더 간결한 코드를 작성할 수 있다. 다음 아래의 코드는 문자열 리스트를 각 문자열에서 다양한 문자가 포함된 순서로 정렬하는 예제이다.

strings = ['foo', 'card', 'bar', 'aaaa', 'abab']
strings.sort(key=lambda x: len(set(list(x))))
print(strings) # ['aaaa', 'foo', 'abab', 'bar', 'card']


클로저 함수

클로저는 함수를 반환하는 함수로, 다른 함수에서 반환되는 동적으로 생성된 함수이다. 클로저와 일반 파이썬 함수의 차이점은 클로저는 클로저를 생성하는 함수가 끝나더라도 생성된 시점의 네임스페이스에 여전히 접근할 수 있다는 점이다.

def make_watcher():
have_seen = {}

def has_been_seen(x):
if x in have_seen:
return True
else:
have_seen[x] = True
return False

return has_been_seen

watcher = make_watcher()
vals = [5, 6, 1, 5, 1, 6, 3, 5]
result = [watcher(x) for x in vals]
print(result) # [False, False, False, True, True, True, False, True]

Share